var rp = require('request-promise');
var logger = require('./logger');

// const TOKEN_URL = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx909bb9da441014f0&secret=a6bce5a3a85ad1731b194067d0124c22';
const TOKEN_URL = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx963f345a42b9b68a&secret=767a852fd19b1bd457cdb99ed28ebe81';
// TODO 调优配置
// const REFRESH_TIME = 3600 * 1.5 * 1000; // token刷新时间
// const EXPIRE_TIME = 3600 * 1.9 * 1000; // token过期时间
// const LIMIT_TIME = 60 * 1000; // token api调用相邻两次间隔时间
const REFRESH_TIME = 10 * 1000; // token刷新时间
const EXPIRE_TIME = 15 * 1000; // token过期时间
const LIMIT_TIME = 3 * 1000; // token api调用相邻两次间隔时间

// 微信token操作
class WeixinToken {

    constructor() {
        this.token = {
            accessToken: null, // token
            createTime: null, // token创建时间
            refreshTime: null, // token刷新时间
            expireTime: null // token过期时间
        };
        this.invokeCount = 0; // 调用次数技术
        this.invokeTime = null; // 获取token api调用时间
    }

    // token获取，返回promise
    async get() {

        try {

            const NOW = Date.now();
            if (this.invokeTime && (NOW - this.invokeTime < LIMIT_TIME)) { // 两次调用间隔时间小于限制时间
                logger.debug(`[WeixinToken] 调用间隔时间小于限制时间，返回缓存token.`)
                return this.token; // 返回缓存token
            }

            this.invokeTime = NOW; // 记录token api调用时间
            // TODO request封装 http://blog.csdn.net/dreamer2020/article/details/52074516
            let token = await rp(TOKEN_URL);
            token = JSON.parse(token);
            this.token.createTime = NOW;
            this.token.refreshTime = NOW + REFRESH_TIME;
            this.token.expireTime = NOW + EXPIRE_TIME;
            this.token.accessToken = token.access_token;
            this.invokeCount++; // 调用微信token api计数.
            logger.debug(`[WeixinToken]  got token from weixin >> ${JSON.stringify(this.token)}`);
            return this.token;
        } catch (err) {
            logger.error(`[WeixinToken] request token from weixin error: ${err}`);
        }

        return null;
    }
}

module.exports = new WeixinToken(); // 导出单例实现
